package main

import (
	"fmt"
)

// /**
//
//	链表反转
//	该算法使用迭代的方式，从头节点开始遍历链表，
//	每次遍历将当前节点的 Next 指向前一个节点，
//
// 然后将前一个节点更新为当前节点，当前节点更新为下一个节点。
// 遍历结束后，前一个节点即为反转后的链表的头节点。
//
// */
type ListNode2 struct {
	Val  int
	Next *ListNode2
}

func reverseList(head *ListNode2) *ListNode2 {

	var pre *ListNode2
	for head != nil {
		next := head.Next
		head.Next = pre
		pre = head
		head = next
	}
	return pre
}

func reverseList1(head *ListNode2) *ListNode2 {

	var pre *ListNode2
	if head != nil {
		next := head.Next
		head.Next = pre
		pre = head
		head = next
	}
	return pre
}

func pl(head *ListNode2) {
	for head != nil {
		fmt.Printf("%d", head.Val)
		head = head.Next
	}
}
func main() {
	l := ListNode2{Val: 1}
	l.Next = &ListNode2{Val: 2}
	l.Next.Next = &ListNode2{Val: 3}
	l.Next.Next.Next = &ListNode2{Val: 4}
	pl(reverseList(&l))
}
